#pragma once
#include "Comm.hpp"

class Init
{
public:
    //创建文件
    Init()
    {
        umask(0);//先将缺省权限清零
        int n = mkfifo(gpipefile.c_str(),gmode);
        if(n < 0)//创建管道文件失败
        {
            cerr<<"mkfifo error"<<endl;
            return;
        }
        cout<<"mkfifo success"<<endl;
    }
    //销毁文件
    ~Init()
    {
        //删除当前路径下的文件
        int n = unlink(gpipefile.c_str());
        //判断是否删除成功
        if(n < 0)
        {
            cerr<<"unlink error"<<endl;
            return;
        }
        cout<<"unlink success"<<endl;
    }
};

Init init;

class Server
{
public:
    //初始化
    Server():_fd(gdefulted){}
    bool OpenPipeForRead()
    {
        _fd = OpenPipe(gForRead);
        if(_fd < 0)return false;
        return true;
    }
    //读取管道
    //string *out:输出型参数
    //const string &输入型参数
    //string &输入输出型参数 
    int RecvPipe(string *out)
    {
        char buffer[gsize];
        //读取文件
        ssize_t n = read(_fd,buffer,sizeof(buffer)-1);//预留一个空间，后面是期望读这么多，n是实际读取的字节数
        if(n > 0)//读取成功
        {
            buffer[n]=0;
            //读取成功将buffer带出去
            *out = buffer;
        }
        //返回read实际的字节数
        return n;
    }
    void ClosePipe()
    {
        ClosePipeHelper(_fd);
    }
    ~Server()
    {}
private:
    int _fd;
};